# -*- coding: utf-8 -*-
# author: sixmillions
# date: 4/6/2022

'''
推导式
从一个数据序列构建另一个新的数据序列的结构体。
列表(list)推导式
字典(dict)推导式
集合(set)推导式
元组(tuple)推导式
'''

# ###
# 列表推导式
# ###
'''
[表达式 for 变量 in 列表] 
[out_exp_res for out_exp in input_list]
或者 
[表达式 for 变量 in 列表 if 条件]
[out_exp_res for out_exp in input_list if condition]

out_exp_res：列表生成元素表达式，可以是有返回值的函数。
for out_exp in input_list：迭代 input_list 将 out_exp 传入到 out_exp_res 表达式中。
if condition：条件语句，可以过滤列表中不符合条件的值。
'''
names = ['Bob', 'Tom', 'alice', 'Jerry', 'Wendy', 'Smith']
print(1, names)  # 1 ['Bob', 'Tom', 'alice', 'Jerry', 'Wendy', 'Smith']
new_names = [name.upper() for name in names]
print(2, new_names)  # 2 ['BOB', 'TOM', 'ALICE', 'JERRY', 'WENDY', 'SMITH']
print(3, [x for x in range(1, 10)])  # 3 [1, 2, 3, 4, 5, 6, 7, 8, 9]
print(4, [x ** 2 for x in range(1, 10)])  # 4 [1, 4, 9, 16, 25, 36, 49, 64, 81]


def myStr(x):
    return str(x) + "H"


# 函数
print(5, [myStr(x) for x in range(1, 10)])  # 5 ['1H', '2H', '3H', '4H', '5H', '6H', '7H', '8H', '9H']

# ###
# 字典推导式
# ###
'''
{ key_expr: value_expr for value in collection }
或
{ key_expr: value_expr for value in collection if condition }
'''
listdemo = ['Google', 'Runoob', 'Taobao']
print(6, listdemo)  # 6 ['Google', 'Runoob', 'Taobao']
newdict = {key: len(key) for key in listdemo}
print(7, newdict)  # 7 {'Google': 6, 'Runoob': 6, 'Taobao': 6}
print(8, {x: x ** 2 for x in (2, 4, 6) if x < 5})  # 8 {2: 4, 4: 16}

# ###
# 集合推导式
# ###
'''
{ expression for item in Sequence }
或
{ expression for item in Sequence if conditional }
'''
print(9, {i ** 2 for i in (1, 2, 3)})  # 9 {1, 4, 9}
print(10, {x for x in 'abracadabra' if x not in 'abc'})  # 10 {'r', 'd'}

# ###
# 元组推导式
# ###
'''
(expression for item in Sequence )
或
(expression for item in Sequence if conditional )
元组推导式和列表推导式的用法也完全相同，只是元组推导式是用 () 圆括号将各部分括起来，而列表推导式用的是中括号 []，另外元组推导式返回的结果是一个生成器对象。
'''
a = (x for x in range(1, 10))
print(11, type(a))  # 11 <class 'generator'>
#  使用 tuple() 函数，可以直接将生成器对象转换成元组
print(tuple(a))  # (1, 2, 3, 4, 5, 6, 7, 8, 9)
